#爬虫函数库
#自己写来玩
#肥肥兔
#2015.8.11
"""
 　　　　　　　　┏┓　　　┏┓+ +
 　　　　　　　┏┛┻━━━┛┻┓ + +
 　　　　　　　┃　　　　　　　┃ 　
 　　　　　　　┃　　　━　　　┃ ++ + + +
 　　　    ████━████  ┃ +
 　　　　　　　┃　　　　　　　┃ +
 　　　　　　　┃　　　┻　　　┃
 　　　　　　　┃　　　　　　　┃ + +
 　　　　　　　┗━┓　　　┏━┛
 　　　　　　　　　┃　　　┃　　　　　　　　　　　
 　　　　　　　　　┃　　　┃ + + + +
 　　　　　　　　　┃　　　┃    Code is far away from bug with the animal protecting　　　　　　　
 　　　　　　　　　┃　　　┃ + 　　　　神兽保佑,代码无bug　　
 　　　　　　　　　┃　　　┃
 　　　　　　　　　┃　　　┃　　+　　　　　　　　　
 　　　　　　　　　┃　 　　┗━━━┓ + +
 　　　　　　　　　┃ 　　　　　　　┣┓
 　　　　　　　　　┃ 　　　　　　　┏┛
 　　　　　　　　　┗┓┓┏━┳┓┏┛ + + + +
 　　　　　　　　　　┃┫┫　┃┫┫
 　　　　　　　　　　┗┻┛　┗┻┛+ + + +
 """


import urllib.request as request
import urllib.error as error
import os 
import re
import socket

timeout = 5#超时5秒，即终止请求
socket.setdefaulttimeout(timeout)
ErrorCode=None#存储错误信息的全局变量(404那些)
ErrorString=None##存储错误信息的全局变量(URL那些)

def GetHtml(url,format ='gbk',timeout = 5):
	"""
	根据url返回html文本，根据format的值转码，默认gbk
	默认超时5秒
	"""
	try:
		response = request.urlopen(url,timeout=timeout)
		html = response.read()
		html = str(html.decode(format))
		return html
	except error.HTTPError as e:
		ErrorCode = e.code
		return False
	except error.URLError as e:
		ErrorString = str(e.reason)
		return False



def GetImage(html,src,padding,num,format='.jpg'):
	"""
	根据正在表达式下载html参数中能匹配的内容
	默认为下载.jpg , .gif , .png格式图片
	默认下载下来为jpg格式
	num为图片的编号
	"""	
	NeedToDown=re.findall(padding,html)
	try:
		for x in NeedToDown:
			adress=src+str(num[0])+format
			if os.path.exists(src) == False  :
				os.makedirs(src)
			print('url='+x,'\nadress='+adress+'\n')
			request.urlretrieve(x,adress)
			num[0]=1+num[0]
		return True
	except :
		return False

def PrintError(the_error):
	"""
	把HTTP的错误转成字符串后，判断错误类型，并输出提醒
	"""
	the_error = str(the_error)
	if the_error == '304':
		print("---304  请求的资源未更新")
	elif the_error == '400':
		print("---400 非法请求")
	elif the_error == '401':
		print("---401 未请求")
	elif the_error == '403':
		print("---403 禁止访问")
	elif the_error == '404':
		print("---404 找不到页面")
	else:
		print("---未知错误---")
	return 



def TurnPage(url,begin=0,end=101):
	"""
	通过一个计数器计数,记完之后与URL前段连接
	返回一个列表
	默认从零开始，遇到100则退出
	"""
	page=[]
	for x in range(begin,end):
		new_url=url+str(x)+'.html'
		page.append(new_url)
	return page



if __name__ == '__main__':
	#下载图片
	url = 'http://www.meizitu.com/a/50'
	
	padding = "http://pic.meizitu.com/wp-content/uploads/2015a/\d{2}/\d{2}/\d{2}.jpg"#正则表达式
	
	begin = 70
	src = "meizi/"
	page = TurnPage(url,begin,75)
	num = [1]
	for url  in page:	
		html = GetHtml(url,'gbk',2)
		if html != False:
			if  GetImage(html,src,padding,num):
				print("----------下载成功--------------")
			else:
				print("----------下载失败--------------")
		elif ErrorString != None:
			print(ErrorString)
		elif ErrorCode != None:
			PrintError(ErrorCode)
	os.system('pause')


